package com.lqian.demo02.utils.test.dao;

import com.lqian.demo02.utils.JDBCUtils;
import com.lqian.demo02.utils.test.dao.mapper.RowMapper;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 在DAO层中，对数据库表的增、删、改、查操作存在代码冗余，可对其进行抽取封装DaoUtils工具类实现复用。
 *  service层捕获异常，进行事务处理
 *  * 事务处理：调用不同dao的多个方法，必须使用同一个connection（connection作为参数传递）
 *  * 事务完成之后，需要在service层进行connection的关闭，在dao层关闭（PreparedStatement和ResultSet对象）
 * @author：Melody_LQ
 * @time：2022/7/14 2:47 下午
 */
public class DaoUtils<T> {
    /**
     *
     * @param sql
     * @param params
     * @return
     * @throws SQLException
     */
    public static int commonUpdate(String sql,Object[] params) throws SQLException {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        int resultRows = 0;

        connection = JDBCUtils.getConnection();
        preparedStatement = connection.prepareStatement(sql);
        if (params!=null) {
            for (int i = 0; i < params.length; i++) {
                preparedStatement.setObject(i + 1, params[i]);
            }
        }
        resultRows = preparedStatement.executeUpdate();
        JDBCUtils.release(null,preparedStatement,null);
        return resultRows;

    }

    /**
     * ResultSet<T> 转集合 List<T>
     * 公共的查询方法(可查询任意一张表、可查询单个对象、也可查询多个对象)
     * @param sql
     * @param rowMapper
     * @param params
     * @return
     */
    public List<T> commonSelect(String sql, RowMapper<T> rowMapper, Object[] params) throws SQLException {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<T> elements = new ArrayList<>();

        connection = JDBCUtils.getConnection();
        preparedStatement = connection.prepareStatement(sql);
        if (params != null) {
            for (int i = 0; i < params.length; i++) {
                preparedStatement.setObject(i + 1, params[i]);
            }
        }
        resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            T row = rowMapper.getRow(resultSet);
            elements.add(row);
        }
        return elements;
    }
}
